package com.atguigu.tingshu.user.api;

import org.springframework.util.StringUtils;

import java.util.concurrent.*;

/**
 * @author atguigu-mqx
 * @ClassName DemoCompletableFuture
 * @description: TODO
 * @date 2023年12月22日
 * @version: 1.0
 */
public class DemoCompletableFuture {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //  异步编排对象 get(); 获取结果 isDone(); 判断当前线程是否执行完成.
        //  CompletableFuture completableFuture = new CompletableFuture();
        //        completableFuture. public abstract void run(); 复制小括号，写死右箭头，落地大括号{方法体} alt+enter
        //  CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> System.out.println("这么早，就上课，困死了."));
        //  System.out.println(voidCompletableFuture.get());

        //        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
        //            System.out.println("死鬼你才回来...");
        //            int i = 1/0;
        //            return 200;
        //        }).whenComplete((t, u)->{
        //            //  第一个参数：上一个线程执行的结果
        //            System.out.println("t:\t"+t);
        //            //  第二个参数：异常信息
        //            System.out.println("u:\t"+u);
        //        }).exceptionally((e)->{
        //            System.out.println("e:\t"+e);
        //            return 404;
        //        });

        //        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.supplyAsync(() -> {
        //            return 200;
        //        }).thenAccept(t -> {
        //            System.out.println(t);
        //        });

        //        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
        //            return 200;
        //        }).thenApplyAsync(t -> {
        //            return 2 * t;
        //        });
        //        System.out.println(integerCompletableFuture.get());

        //  自定义线程池： 不能使用工具类创建的线程池，因为会导致OOM!
        //  七个核心参数：参数设置，线程池工作原理?
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5, // 核心线程个数 IO:2n CPU:n+1 n:cpu核数
                10,// 最大线程个数
                3, // 空闲线程存活时间
                TimeUnit.SECONDS,// 空闲线程存活时间单位
                new ArrayBlockingQueue<>(3)
        );

        //  先创建一个线程A：返回一个hello;
        //        CompletableFuture<String> completableFutureA = CompletableFuture.supplyAsync(() -> {
        //            System.out.println("completableFutureA");
        //            return "hello";
        //        });
        //
        //        //  再创建一个线程B：接收上一个线程返回hello;
        //        CompletableFuture<Void> completableFutureB = completableFutureA.thenAcceptAsync(a -> {
        //            try {
        //                Thread.sleep(3000);
        //            } catch (InterruptedException e) {
        //                throw new RuntimeException(e);
        //            }
        //            System.out.println(a + "\tB");
        //        });
        //        //  再创建一个线程C：接收上一个线程返回hello;
        //        CompletableFuture<Void> completableFutureC = completableFutureA.thenAcceptAsync(a -> {
        //            try {
        //                Thread.sleep(1000);
        //            } catch (InterruptedException e) {
        //                throw new RuntimeException(e);
        //            }
        //            System.out.println(a + "\tC");
        //        });
        //        System.out.println(completableFutureA.get());
        //        System.out.println(completableFutureB.get());
        //        System.out.println(completableFutureC.get());

        CompletableFuture<Integer> completableFutureA = CompletableFuture.supplyAsync(() -> {
            System.out.println("A");
            return 200;
        });
        CompletableFuture<Integer> completableFutureB = CompletableFuture.supplyAsync(() -> {
            System.out.println("B");
            return 300;
        });

        CompletableFuture<Integer> completableFutureC = CompletableFuture.supplyAsync(() -> {
            System.out.println("C");
            return 400;
        });

        //  threadPoolExecutor.shutdown();

        //  商品详情：
        //  CompletableFuture.allOf(completableFutureA, completableFutureB, completableFutureC).join();
        CompletableFuture.anyOf(completableFutureA, completableFutureB, completableFutureC).join();


    }
}
